
رایتاپ ها
زمان مطالعه :12 دقیقه
خرید دوره ها با قیمت کمتر در هانت لرن!
خب اول از همه بریم سراغ فلو خرید محصول تو هانت لرن تا ببینیم چجوری اصلا کار میکنه.
مثل همه سایتای فروشگاهی بعد از انتخاب محصول یه دکمه ای داریم به اسم "اضافه کردن به سبد خرید".
بعد از زدن این دکمه درخواست زیر ارسال میشه و محصول ما به سبد خریدمون اضافه میشه. ولی چجوری میفهمه به سبد خرید کدوم کاربر باید اضافه بشه ؟ با استفاده از توکن Bearer.

حالا تو سبد خرید من یک محصول وجود داره که میتونم مراحل دیگه رو طی کنم تا عملیات پرداخت رو انجام بدم و اگر موفقیت آمیز بود ، این محصول به لیست محصولاتم اضافه میشه.
مرحله بعدی "تکمیل فرآیند خرید" هست که بعد از ورود به سبد خرید و کلیک روی این دکمه (تکمیل فرآیند خرید) ، درخواست زیر ارسال میشه و یک payment_url برای ما ساخته میشه.(توکن پرداخت)

و در آخر هم ، بعد از پرداخت موفق این درخواست Callback صدا زده میشه که شامل توکن دریافتی ما تو مرحله قبل هست + Bearer Token که مشخص کنه سبد خرید کدوم کاربر پرداخت شده :

اینجا چندتا سناریو اینجا به ذهنم رسید که با شکست مواجه شد ولی همین سناریوهای شکست خورده باعث شدن که سناریو اصلی ساخته بشه. مهم تریناشو بهتون میگم.
سناریو اول :
بعد از انجام عملیات پرداخت و هنگامی که سبد خرید در حال validate شدن هست ، من میام و یک محصول دیگه رو به سبد خریدم اضافه میکنم. به این روش میگن Multi-endpoint Race Condition (اطلاعات بیشتر : https://youtu.be/nQwXztEZGiE)
وقتی این حرکت رو زدم محصول به سبد خرید اضافه شد ولی داخل لیست محصولات من نبود. شکست اول.
سناریو دوم :
اول یک محصول با قیمت کمتر به سبد خریدم اضافه میکنم ( به طور مثل 100 هزارتومن ) ، حالا هنگامی که وارد درگاه پرداخت میشم ( برای پرداخت مبلغ 100 هزارتومان ) ، همزمان یه محصول دیگه با قیمت بیشتر به سبد خریدم اضافه میکنم. محصول اضافه شد ولی در آخر محصول گرون تر به لیست محصولاتم اضافه نشده بود ، فقط همون محصولی که بابتش پول داده بودم اضافه شد. شکست دوم.
سناریو سوم :
Double Spending , Race Condition + Double Spending , Price Manipulation , etc
اینجا فلو کار رو عمیق تر درک کردم و فهمیدم که هنگامی که محصول A رو به سبد خرید اضافه میکنیم و دکمه "تکمیل فرآیند خرید" رو میزنیم ، یک توکن مخصوص برای سبد خرید جاری برای ما ساخته میشه (توکن پرداخت به سبد خرید کاربر جاری بایند میشه) و در آخر پس از پرداخت موفق ، با استفاده از توکن پرداخت ، سبد خرید کاربر چک میشه و تنها محصولاتی که بهش اضافه شده بود ، وارد لیست محصولات من میشه.
سناریو اصلی :
من دوتا اکانت میسازم به اسم های A و B.
حالا با اکانت Aام یک محصول ارزون به سبد خریدم اضافه میکنم و عملیات پرداخت رو انجام میدم ولی جلوی ارسال درخواست Callback رو میگیرم. (الان من یک توکن دارم که پرداخت شده و کاملا ولید هست ولی داخل دیتابیس ثبت نشده )
تو مرحله بعد با اکانت B میام و یک محصول گرون قیمت رو به سبد خریدم اضافه میکنم. حالا Bearer Token اکانت B ام رو برمیدارم و داخل درخواست Callback اکانت A جایگزین میکنم و سپس درخواست رو ارسال میکنم.
و اینجوری میشه که سبد خرید اکانت Bام ولیدیت میشه و محصول گرون تر به لیست محصولاتم اضافه میشه. (درصورتی که من فقط پول یه محصول خیلی ارزون تر رو پرداخت کردم)
چرا این اتفاق افتاد ؟
بچه ها قبلش حواستون باشه Bearer Token رو با توکن پرداخت قاطی نکنین.
بالاتر ما چی گفتیم ؟ گفتیم توکن پرداختی به سبد خرید جاری کاربر بایند میشه. چجوری ؟ با استفاده از Bearer Token کاربر.
خیلی ساده بخوام بگم اینجور در نظر بگیرین :
اگر سبد خرید برای کاربر جاری باشد و توکن پرداختی معتبر باشد -> عملیات ولیدیشن صورت میگیرد (کاربر جاری چه محصولاتی را به سبد خرید اضافه کرده و آیا پرداخت کرده و ...) -> اگر ولیدیشن با موفقیت انجام شد -> محصول به سبد خرید اضافه میشه.
اگر سبد خرید برای کاربر جاری نباشد ولی توکن پرداختی آن معتبر باشد -> عملیات ولیدیشن صورت نمیگیرد -> محصول به سبد خرید اضافه میشه.

عرفان توکلی
مشاهده مقاله های بیشتر